//请求工具类

// xmlHttpRequest 异步请求，参数对应：（请求路径，成功函数,失败函数,请求方式，请求数据，请求头）
function sendByXhr(url, successFun, failFun, method = 'POST', data = null, headers = {}) {
    const xhr = new XMLHttpRequest();
    xhr.open(method, url, true);
    //轮询请求头，如果是@RequestBody，需要传来一个{"Content-Type", "application/json"}
    for (const key in headers) {
        if (Object.hasOwnProperty.call(headers, key)) {
            let v = headers[key];
            xhr.setRequestHeader(key, v);
        }
    }
    xhr.responseType = 'json';
    if (null === data) {
        xhr.send();
    } else {
        xhr.send(data);
    }
    // 对结果监听
    xhr.addEventListener('load', () => {
        if (xhr.readyState === 4 && xhr.status >= 200 && xhr.status < 300) {
            if (xhr.response['code'] !== undefined) {
                failFun(xhr.response['message']);
            } else {
                successFun(xhr.response);
            }
        } else {
            failFun("请求失败:无网络或后端地址异常，请检查！【【【如若一直不行，请联系我！】】】");
        }
    });
    // 对错误进行监听
    xhr.addEventListener('error', () => {
        failFun("请求失败:无网络或后端地址异常，请检查！【【【如若一直不行，请联系我！】】】");
    });
}

// fetch 异步请求，参数对应：（请求路径，成功函数,失败函数,请求方式，请求数据，请求头）
function sendByFetch(url, successFun, failFun, method = 'POST', data = null, headers = {}) {
    const request = new Request(url);
    //轮询请求头，如果是@RequestBody，需要传来一个[{"Content-Type", "application/json"}]
    const header = new Headers();
    for (const key in headers) {
        if (Object.hasOwnProperty.call(headers, key)) {
            let v = headers[key];
            header.append(key, v);
        }
    }
    fetch(request, {
        method,
        headers: header,
        body: data
    }).then(response => {
        const v = response.json();
        v.then(vv => {
            if (vv['code'] !== undefined) {
                failFun(vv['message']);
            } else {
                successFun(vv);
            }
        });
    }).catch(e => {
        failFun('请求失败:无网络或后端地址异常，请检查！【【【如若一直不行，请联系我！】】】');
    });
}


// 下载文件的请求

// gat的方式,参数对应(请求地址，请求参数)
function downloadFileByGet(url, data = {}) {
    if (url.includes('?')) {
        url += '&';
    } else {
        url += '?';
    }
    for (const key in data) {
        if (Object.hasOwnProperty.call(data, key)) {
            let v = data[key];
            url += key + '=' + v + '&';
        }
    }
    window.open(url.substr(0, url.length - 1));
}

// post 的方式，参数对应（请求地址，请求参数, 是否需要转为json字符串），为了用于数据量大的请求，因为get请求允许的数据长度很小
function downloadFileByPosst(url, data = []) {
    const fromEl = document.createElement('form');
    fromEl.action = url;
    fromEl.method = 'POST';
    fromEl.style.display = 'none';
    fromEl.target = '_blank';
    for (const key in data) {
        if (Object.hasOwnProperty.call(data, key)) {
            let v = data[key];
            const dataInput = document.createElement('input');
            dataInput.type = 'text';
            dataInput.name = key;
            dataInput.value = v;
            fromEl.appendChild(dataInput);
        }
    }
    // 将表单添加到页面并提交
    document.body.appendChild(fromEl);
    fromEl.submit();
    // 移除表单（可选）
    document.body.removeChild(fromEl);
}